<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>percolate 查询 | ElasticSearch 7.7 权威指南中文版</title>
	<meta name="keywords" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <meta name="description" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
	<script>
	var _link = 'query-dsl-percolate-query.html';
    </script>
</head>
<body>
<div class="main-container">
    <section id="content">
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.7/query-dsl-percolate-query.html" rel="nofollow" target="_blank">https://www.elastic.co/guide/en/elasticsearch/reference/7.7/query-dsl-percolate-query.html</a>, 原文档版权归 www.elastic.co 所有<br/>本地英文版地址: <a href="../en/query-dsl-percolate-query.html" rel="nofollow" target="_blank">../en/query-dsl-percolate-query.html</a></div>
                        <!-- start body -->
                  <div class="page_header">
<strong>重要</strong>: 此版本不会发布额外的bug修复或文档更新。最新信息请参考 <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html" rel="nofollow">当前版本文档</a>。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch 权威指南 [7.7]</a></span>
»
<span class="breadcrumb-link"><a href="query-dsl.html">查询领域特定语言(Query DSL)</a></span>
»
<span class="breadcrumb-link"><a href="specialized-queries.html">专业的查询</a></span>
»
<span class="breadcrumb-node">percolate 查询</span>
</div>
<div class="navheader">
<span class="prev">
<a href="query-dsl-mlt-query.html">« more_like_this 查询</a>
</span>
<span class="next">
<a href="_notes_4.html">注意 »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="query-dsl-percolate-query"></a>percolate 查询
</h2>
</div></div></div>

<p>
percolate查询可用于匹配存储在索引中的查询。

<code class="literal">percolate</code> 查询本身包含将用作查询的文档，以匹配存储的查询。
</p>
<h3>
<a id="_sample_usage"></a>使用示例
</h3>
<p>创建一个有2个字段的索引：</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">PUT /my-index
{
    "mappings": {
        "properties": {
             "message": {
                 "type": "text"
             },
             "query": {
                 "type": "percolator"
             }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/238.console"></div>
<p>
<code class="literal">message</code> 字段是用于在将 <code class="literal">percolator</code> 查询中定义的文档编入临时索引之前对其进行预处理的字段。
</p>
<p>
<code class="literal">query</code> 字段用于索引查询文档。

它将保存一个 json 对象，表示一个实际的 Elasticsearch 查询。

字段 <code class="literal">query</code> 已在映射中配置为使用<a class="xref" href="percolator.html" title="Percolator type">percolator字段类型</a>。

这个字段类型理解查询领域专用语言(dsl)，并以这样的方式存储查询，以便以后可以使用它来匹配在 <code class="literal">percolate</code> 查询中定义的文档。
</p>
<p>在 percolator 中注册一个查询<span class="remark">（相当于添加并索引一个id为1的文档）</span>：</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">PUT /my-index/_doc/1?refresh
{
    "query" : {
        "match" : {
            "message" : "bonsai tree"
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/239.console"></div>
<p>将文档与注册的 percolator 查询进行匹配：</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /my-index/_search
{
    "query" : {
        "percolate" : {
            "field" : "query",
            "document" : {
                "message" : "A new bonsai tree in the office"
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/240.console"></div>
<p>上面这个请求将产生如下响应：</p>
<div class="pre_wrapper lang-console-result">
<pre class="programlisting prettyprint lang-console-result">{
  "took": 13,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped" : 0,
    "failed": 0
  },
  "hits": {
    "total" : {
        "value": 1,
        "relation": "eq"
    },
    "max_score": 0.26152915,
    "hits": [
      { <a id="CO50-1"></a><i class="conum" data-value="1"></i>
        "_index": "my-index",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.26152915,
        "_source": {
          "query": {
            "match": {
              "message": "bonsai tree"
            }
          }
        },
        "fields" : {
          "_percolator_document_slot" : [0] <a id="CO50-2"></a><i class="conum" data-value="2"></i>
        }
      }
    ]
  }
}</pre>
</div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO50-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>id 为 <code class="literal">1</code> 的 query 与文档匹配。</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO50-2"><i class="conum" data-value="2"></i></a></p>
</td>
<td align="left" valign="top">
<p>
字段 <code class="literal">_percolator_document_slot</code> 指示哪个文档与该查询匹配。

在同时渗透(percolating)多个文档时非常有用。
</p>
</td>
</tr>
</table>
</div>
<div class="tip admon">
<div class="icon"></div>
<div class="admon_content">
<p>
为了举一个简单的例子，这个文档为 percolate 查询和文档使用一个名为 my-index 的索引。

当只注册了几个 percolate 查询时，这种设置可以很好地工作。

但是，如果使用量较大，建议将查询和文档存储在单独的索引中。

更多细节请参考 <a class="xref" href="query-dsl-percolate-query.html#how-it-works" title="How it Works Under the Hood">它如何在引擎盖下工作的</a>。
</p>
</div>
</div>
<h4>
<a id="_parameters_3"></a>参数
</h4>
<p>渗透(percolating)文档时需要以下参数：</p>
<div class="informaltable">
<table border="0" cellpadding="4px">
<colgroup>
<col>
<col>
</colgroup>
<tbody valign="top">
<tr>
<td valign="top">
<p>
<code class="literal">field</code>
</p>
</td>
<td valign="top">
<p>
(必需) 保存索引查询的 <code class="literal">percolator</code> 类型的字段。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">name</code>
</p>
</td>
<td valign="top">
<p>
(可选) 在指定了多个 <code class="literal">percolate</code> 查询的情况下，用于 <code class="literal">_percolator_document_slot</code> 字段的后缀。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">document</code>
</p>
</td>
<td valign="top">
<p>
被渗透的文档源。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">documents</code>
</p>
</td>
<td valign="top">
<p>
类似于 <code class="literal">document</code> 参数，但是可以通过 json 数组接受多个文档。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">document_type</code>
</p>
</td>
<td valign="top">
<p>
被渗透的文档的类型(type)/映射(mapping)。此参数已被废弃，将在 Elasticsearch 8.0 中移除。
</p>
</td>
</tr>
</tbody>
</table>
</div>
<p>
也可以从已经存储的文档中检索源，而不是指定要渗透的文档源。

然后，<code class="literal">percolate</code> 查询将在内部执行一个 get 请求来获取文档。
</p>
<p>
在这种情况下，<code class="literal">document</code> 参数可以用以下参数替换：
</p>
<div class="informaltable">
<table border="0" cellpadding="4px">
<colgroup>
<col>
<col>
</colgroup>
<tbody valign="top">
<tr>
<td valign="top">
<p>
<code class="literal">index</code>
</p>
</td>
<td valign="top">
<p>
(必需) 文档所在的索引。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">type</code>
</p>
</td>
<td valign="top">
<p>
要获取的文档的类型。此参数已被废弃，将在 Elasticsearch 8.0 中移除。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">id</code>
</p>
</td>
<td valign="top">
<p>
(必需) 要获取的文档的 id。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">routing</code>
</p>
</td>
<td valign="top">
<p>
(可选) 用于获取要渗透(percolate)的文档的路由。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">preference</code>
</p>
</td>
<td valign="top">
<p>
(可选) 用于获取要渗透的文档的首选项。
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">version</code>
</p>
</td>
<td valign="top">
<p>
(可选) 预期要获取的文档的版本。
</p>
</td>
</tr>
</tbody>
</table>
</div>
<h4>
<a id="_percolating_in_a_filter_context"></a>在过滤上下文中渗透（percolating in a filter context）
</h4>
<p>
如果你对相关性评分不感兴趣，可以通过将 <code class="literal">percolator</code> 查询包裹在 <code class="literal">bool</code> 查询的 filter 子句或 <code class="literal">constant_score</code> 查询中来获得更好的性能：
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /my-index/_search
{
    "query" : {
        "constant_score": {
            "filter": {
                "percolate" : {
                    "field" : "query",
                    "document" : {
                        "message" : "A new bonsai tree in the office"
                    }
                }
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/241.console"></div>
<p>
在索引时，从渗透器(percolator) query 中提取 词项(term)，渗透器通常可以通过查看这些提取的词项来确定查询是否匹配。

然而，计算得分需要对每个匹配的查询进行反序列化，并在渗透后的文档上运行，这是一个成本很高的操作。

因此，如果不需要计算得分，则 <code class="literal">percolate</code> 查询应该包裹在一个 <code class="literal">constant_score</code> 查询或 <code class="literal">bool</code> 查询的 filter 子句中。
</p>
<p>
请注意，查询缓存永远不会缓存 <code class="literal">percolate</code> 查询。
</p>
<h4>
<a id="_percolating_multiple_documents"></a>渗透多个文档 (percolating multiple documents)
</h4>
<p>
<code class="literal">percolate</code> 查询可以用索引过的渗透查询同时匹配多个文档。

在单个请求中渗透多个文档可以提高性能，因为查询只需要解析和匹配一次，而不是多次。
</p>
<p>
同时渗透多个文档时，每个匹配的渗透器查询返回的 <code class="literal">_percolator_document_slot</code> 字段非常重要。

它指示哪些文档与特定的渗透器查询相匹配。

这些数字与 <code class="literal">percolate</code> 查询中指定的 <code class="literal">documents</code> 数组中的槽相关。
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /my-index/_search
{
    "query" : {
        "percolate" : {
            "field" : "query",
            "documents" : [ <a id="CO51-1"></a><i class="conum" data-value="1"></i>
                {
                    "message" : "bonsai tree"
                },
                {
                    "message" : "new tree"
                },
                {
                    "message" : "the office"
                },
                {
                    "message" : "office tree"
                }
            ]
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/242.console"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO51-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p><code class="literal">documents</code> 数组包含4个将被同时渗透的文档。</p>
</td>
</tr>
</table>
</div>
<div class="pre_wrapper lang-console-result">
<pre class="programlisting prettyprint lang-console-result">{
  "took": 13,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped" : 0,
    "failed": 0
  },
  "hits": {
    "total" : {
        "value": 1,
        "relation": "eq"
    },
    "max_score": 0.7093853,
    "hits": [
      {
        "_index": "my-index",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.7093853,
        "_source": {
          "query": {
            "match": {
              "message": "bonsai tree"
            }
          }
        },
        "fields" : {
          "_percolator_document_slot" : [0, 1, 3] <a id="CO52-1"></a><i class="conum" data-value="1"></i>
        }
      }
    ]
  }
}</pre>
</div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO52-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p><code class="literal">_percolator_document_slot</code> 表示在 <code class="literal">percolate</code> 查询中指定的第一个、第二个和最后一个文档与该查询匹配。</p>
</td>
</tr>
</table>
</div>
<h4>
<a id="_percolating_an_existing_document"></a>渗透一个已存在的文档 (percolating an existing document)
</h4>
<p>
为了渗透新索引的文档，可以使用 <code class="literal">percolate</code> 查询。

基于来自索引请求的响应，可以使用 <code class="literal">_id</code> 和其他元信息来立即渗透新添加的文档。
</p>
<h5>
<a id="_example"></a>示例
</h5>
<p>基于前面的例子。</p>
<p>索引要渗透的文档：</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">PUT /my-index/_doc/2
{
  "message" : "A new bonsai tree in the office"
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/243.console"></div>
<p>索引响应：</p>
<div class="pre_wrapper lang-console-result">
<pre class="programlisting prettyprint lang-console-result">{
  "_index": "my-index",
  "_type": "_doc",
  "_id": "2",
  "_version": 1,
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "result": "created",
  "_seq_no" : 1,
  "_primary_term" : 1
}</pre>
</div>
<p>渗透现有文档，使用索引响应作为基础来构建新的搜索请求：</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /my-index/_search
{
    "query" : {
        "percolate" : {
            "field": "query",
            "index" : "my-index",
            "id" : "2",
            "version" : 1 <a id="CO53-1"></a><i class="conum" data-value="1"></i>
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/244.console"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO53-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>
version 是可选的，但在某些情况下很有用。

我们可以确保我们正在尝试渗透我们刚刚索引的文档。

在我们建立索引后，可能会进行更改，如果是这种情况，搜索请求将会失败，并抛出版本的冲突错误。
</p>
</td>
</tr>
</table>
</div>
<p>返回的搜索响应与前面的示例相同。

</p>
<h4>
<a id="_percolate_query_and_highlighting"></a>percolate 查询以及高亮
</h4>
<p>
当需要高亮显示时，<code class="literal">percolate</code> 查询以一种特殊的方式处理。

查询命中用于高亮 <code class="literal">percolate</code> 查询中提供的文档。

而对于常规高亮显示，搜索请求中的查询用于高亮显示命中。
</p>
<h5>
<a id="_example_2"></a>示例
</h5>
<p>这个示例基于第一个示例中的mapping。</p>
<p>保存一个查询：</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">PUT /my-index/_doc/3?refresh
{
    "query" : {
        "match" : {
            "message" : "brown fox"
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/245.console"></div>
<p>保存另外一个查询：</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">PUT /my-index/_doc/4?refresh
{
    "query" : {
        "match" : {
            "message" : "lazy dog"
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/246.console"></div>
<p>在启用高亮显示的情况下执行 <code class="literal">percolate</code> 查询搜索请求：</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /my-index/_search
{
    "query" : {
        "percolate" : {
            "field": "query",
            "document" : {
                "message" : "The quick brown fox jumps over the lazy dog"
            }
        }
    },
    "highlight": {
      "fields": {
        "message": {}
      }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/247.console"></div>
<p>这将产生以下响应：</p>
<div class="pre_wrapper lang-console-result">
<pre class="programlisting prettyprint lang-console-result">{
  "took": 7,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped" : 0,
    "failed": 0
  },
  "hits": {
    "total" : {
        "value": 2,
        "relation": "eq"
    },
    "max_score": 0.26152915,
    "hits": [
      {
        "_index": "my-index",
        "_type": "_doc",
        "_id": "3",
        "_score": 0.26152915,
        "_source": {
          "query": {
            "match": {
              "message": "brown fox"
            }
          }
        },
        "highlight": {
          "message": [
            "The quick &lt;em&gt;brown&lt;/em&gt; &lt;em&gt;fox&lt;/em&gt; jumps over the lazy dog" <a id="CO54-1"></a><i class="conum" data-value="1"></i>
          ]
        },
        "fields" : {
          "_percolator_document_slot" : [0]
        }
      },
      {
        "_index": "my-index",
        "_type": "_doc",
        "_id": "4",
        "_score": 0.26152915,
        "_source": {
          "query": {
            "match": {
              "message": "lazy dog"
            }
          }
        },
        "highlight": {
          "message": [
            "The quick brown fox jumps over the &lt;em&gt;lazy&lt;/em&gt; &lt;em&gt;dog&lt;/em&gt;" <a id="CO54-2"></a><i class="conum" data-value="1"></i>
          ]
        },
        "fields" : {
          "_percolator_document_slot" : [0]
        }
      }
    ]
  }
}</pre>
</div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO54-1"><i class="conum" data-value="1"></i></a><a href="#CO54-2"></a></p>
</td>
<td align="left" valign="top">
<p>文档中高亮显示了每个查询中的词项。</p>
</td>
</tr>
</table>
</div>
<p>
不是搜索请求中的查询高亮显示渗透器命中，而是渗透器查询高亮显示 <code class="literal">percolate</code> 查询中定义的文档。
</p>
<p>
当像下面的请求一样同时渗透多个文档时，高亮显示的响应是不同的：
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /my-index/_search
{
    "query" : {
        "percolate" : {
            "field": "query",
            "documents" : [
                {
                    "message" : "bonsai tree"
                },
                {
                    "message" : "new tree"
                },
                {
                    "message" : "the office"
                },
                {
                    "message" : "office tree"
                }
            ]
        }
    },
    "highlight": {
      "fields": {
        "message": {}
      }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/248.console"></div>
<p>响应略有不同，如下所示：</p>
<div class="pre_wrapper lang-console-result">
<pre class="programlisting prettyprint lang-console-result">{
  "took": 13,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped" : 0,
    "failed": 0
  },
  "hits": {
    "total" : {
        "value": 1,
        "relation": "eq"
    },
    "max_score": 0.7093853,
    "hits": [
      {
        "_index": "my-index",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.7093853,
        "_source": {
          "query": {
            "match": {
              "message": "bonsai tree"
            }
          }
        },
        "fields" : {
          "_percolator_document_slot" : [0, 1, 3]
        },
        "highlight" : { <a id="CO55-1"></a><i class="conum" data-value="1"></i>
          "0_message" : [
              "&lt;em&gt;bonsai&lt;/em&gt; &lt;em&gt;tree&lt;/em&gt;"
          ],
          "3_message" : [
              "office &lt;em&gt;tree&lt;/em&gt;"
          ],
          "1_message" : [
              "new &lt;em&gt;tree&lt;/em&gt;"
          ]
        }
      }
    ]
  }
}</pre>
</div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO55-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>高亮显示的字段已经以它们所属的文档槽(slot)为前缀，以便知道哪个高亮显示的字段属于哪个文档。</p>
</td>
</tr>
</table>
</div>
<h4>
<a id="_specifying_multiple_percolate_queries"></a>指定多个 percolate 查询
</h4>
<p>可以在单个搜索请求中指定多个 <code class="literal">percolate</code> 查询：</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /my-index/_search
{
    "query" : {
        "bool" : {
            "should" : [
                {
                    "percolate" : {
                        "field" : "query",
                        "document" : {
                            "message" : "bonsai tree"
                        },
                        "name": "query1" <a id="CO56-1"></a><i class="conum" data-value="1"></i>
                    }
                },
                {
                    "percolate" : {
                        "field" : "query",
                        "document" : {
                            "message" : "tulip flower"
                        },
                        "name": "query2" <a id="CO56-2"></a><i class="conum" data-value="1"></i>
                    }
                }
            ]
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/249.console"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO56-1"><i class="conum" data-value="1"></i></a><a href="#CO56-2"></a></p>
</td>
<td align="left" valign="top">
<p><code class="literal">name</code> 参数将用于识别哪个 percolator 文档槽属于哪个 <code class="literal">percolate</code> 查询。</p>
</td>
</tr>
</table>
</div>
<p>
<code class="literal">_percolator_document_slot</code> 字段名将以参数 <code class="literal">_name</code> 中指定的内容作为后缀。

如果没有指定，那么将使用参数 <code class="literal">field</code>，在这种情况下会产生歧义。
</p>
<p>上面的搜索请求返回类似于以下内容的响应：</p>
<div class="pre_wrapper lang-console-result">
<pre class="programlisting prettyprint lang-console-result">{
  "took": 13,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped" : 0,
    "failed": 0
  },
  "hits": {
    "total" : {
        "value": 1,
        "relation": "eq"
    },
    "max_score": 0.26152915,
    "hits": [
      {
        "_index": "my-index",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.26152915,
        "_source": {
          "query": {
            "match": {
              "message": "bonsai tree"
            }
          }
        },
        "fields" : {
          "_percolator_document_slot_query1" : [0] <a id="CO57-1"></a><i class="conum" data-value="1"></i>
        }
      }
    ]
  }
}</pre>
</div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO57-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>
<code class="literal">_percolator_document_slot_query1</code> 渗透器槽字段指示这些匹配的槽(slot)来自 <code class="literal">_name</code> 参数设置为 <code class="literal">query1</code>的 <code class="literal">percolate</code> 查询。
</p>
</td>
</tr>
</table>
</div>
<h4>
<a id="how-it-works"></a>它是如何工作的?
</h4>
<p>
当将文档索引到配置了<a class="xref" href="percolator.html" title="Percolator type">percolator字段类型</a>映射的索引中时，文档的查询部分被解析成 Lucene 查询并存储到 Lucene 索引中。

存储查询的二进制表示，而且还分析查询的词项并存储到一个索引字段中。 
</p>
<p>
在搜索时，请求中指定的文档被解析成 Lucene 文档，并存储在内存中的临时 Lucene 索引中。

这个内存索引只能保存这一个文档，它为此进行了优化。  

在此之后，基于内存索引中的词项构建一个特殊的查询，该查询基于候选渗透器查询的索引查询词项来选择候选渗透器查询。

然后，如果这些查询确实匹配，则由内存中的索引对它们进行评估。
</p>
<p>
候选渗透器查询匹配的选择是 <code class="literal">percolate</code> 查询执行期间的重要性能优化，因为它可以显著减少内存索引需要评估的候选匹配的数量。

<code class="literal">percolate</code> 查询可以这样做的原因是因为在渗透器查询的索引过程中，查询词项被提取并用渗透器查询进行索引。

不幸的是，渗透器无法从所有查询中提取词项(例如<code class="literal">wildcard</code>或<code class="literal">geo_shape</code>查询)，因此在某些情况下，渗透器无法进行选择优化(例如，如果在 bool 查询的必需的子句中定义了不支持的查询，或者不支持的查询是渗透器文档中唯一的查询)。

这些查询由渗透器标记，可以通过运行以下搜索找到：
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
  "query": {
    "term" : {
      "query.extraction_result" : "failed"
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/250.console"></div>
<div class="note admon">
<div class="icon"></div>
<div class="admon_content">
<p>上面的例子假设在mapping中有一个 <code class="literal">percolator</code> 类型的 <code class="literal">query</code> 字段。</p>
</div>
</div>
<p>
考虑到渗透的设计，对渗透查询和被渗透的文档使用单独的索引通常是有意义的，而不是像我们在示例中那样使用单一的索引。这种方法有几个好处:

这种方法有几个好处：
</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
因为 percolate 查询包含一组不同于被渗透的文档的字段，使用两个独立的索引允许以更密集、更有效的方式存储字段。
</li>
<li class="listitem">
percolate 查询的可伸缩性与其他查询不同，因此使用不同的索引配置(如主分片的数量)可能有利于渗透性能。
</li>
</ul>
</div>
</div>
<div class="navfooter">
<span class="prev">
<a href="query-dsl-mlt-query.html">« more_like_this 查询</a>
</span>
<span class="next">
<a href="_notes_4.html">注意 »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>